// 路由鉴权：项目中的路由能不能被访问的权限设置
import router from "./router"
// @ts-ignore
import nprogress from 'nprogress'
import setting from "./setting"
// 引入进度条样式
import 'nprogress/nprogress.css'
nprogress.configure({ showSpinner: false })
// 获取用户相关的小仓库中的token数据，来判断用户是否登录
import useUserStore from "./store/modules/user"
import pinia from "./store"
let userStore = useUserStore(pinia)

// 全局守卫：项目当中任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach(async (to, from, next) => {
   document.title = `${setting.title} - ${to.meta.title}`
   // to:你将要访问那个路由
   // from:你从哪个路由而来
   // next:路由的放行函数
   nprogress.start()
   // 获取token，判断用户的登录状态
   let token = userStore.token
   // 获取用户名字
   let username = userStore.username
   if (token) {
      // 用户登录成功：不能访问login(指向首页),其余都可访问
      if (to.path == '/login') {
         next({ path: '/' })
      } else {
         if (username) {
            next()
         } else {
            // 如果没有用户信息，在守卫这里发起用户信息再放行
            try {
               await userStore.userInfo()
               // 如果刷新时为异步路由，有可能获取到了用户信息、异步路由还没有加载完毕，所以出现了空白效果
               next({ ...to })
            } catch {
               // token过期或手动修改本地token，会导致获取用户信息失败
               // 退出登录，用户相关信息清空
               await userStore.userLogOut()
               next({ path: '/login', query: { redirect: to.path } })
            }
         }
      }
   } else {
      // 用户未登录：只能访问login，其余路由不可访问(指向login)
      if (to.path == '/login') {
         next()
      } else {
         next({ path: '/login', query: { redirect: to.path } })
      }
   }
});


// 全局后置守卫
router.afterEach((to, from) => {
   nprogress.done()
});


